package org.goodsmanager.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.goodsmanager.entity.Cart;

import java.util.List;

/**
 * 购物车Mapper接口
 *
 * @author Goods Manager System
 * @version 1.0.0
 */
@Mapper
public interface CartMapper {

    /**
     * 根据用户ID查询购物车列表
     */
    List<Cart> selectByUserId(@Param("userId") String userId);

    /**
     * 根据用户ID和商品ID查询购物车项
     */
    Cart selectByUserIdAndProductId(@Param("userId") String userId, @Param("productId") String productId);

    /**
     * 添加购物车项
     */
    int insert(Cart cart);

    /**
     * 更新购物车项
     */
    int update(Cart cart);

    /**
     * 更新购物车项数量
     */
    int updateQuantity(@Param("userId") String userId, @Param("productId") String productId, @Param("quantity") Integer quantity);

    /**
     * 更新购物车项选中状态
     */
    int updateSelected(@Param("userId") String userId, @Param("productId") String productId, @Param("selected") Boolean selected);

    /**
     * 批量更新购物车项选中状态
     */
    int updateSelectedBatch(@Param("userId") String userId, @Param("productIds") List<String> productIds, @Param("selected") Boolean selected);

    /**
     * 更新用户所有购物车项选中状态
     */
    int updateSelectedAll(@Param("userId") String userId, @Param("selected") Boolean selected);

    /**
     * 删除购物车项
     */
    int delete(@Param("userId") String userId, @Param("productId") String productId);

    /**
     * 批量删除购物车项
     */
    int deleteBatch(@Param("userId") String userId, @Param("productIds") List<String> productIds);

    /**
     * 清空用户购物车
     */
    int deleteByUserId(@Param("userId") String userId);

    /**
     * 获取用户选中的购物车项
     */
    List<Cart> selectSelectedByUserId(@Param("userId") String userId);

    /**
     * 获取用户购物车项数量
     */
    int countByUserId(@Param("userId") String userId);

    /**
     * 更新购物车项商品信息（用于商品信息变更时同步）
     */
    int updateProductInfo(@Param("productId") String productId, @Param("productName") String productName, 
                         @Param("productImage") String productImage, @Param("productPrice") Double productPrice,
                         @Param("stockQuantity") Integer stockQuantity, @Param("productStatus") Integer productStatus);
}